#include <asm/shadow.h>
#include <asm/privop_stat.h>
-unsigned long dom0_start = -1L;
unsigned long dom0_size = 512*1024*1024;
unsigned long dom0_align = 64*1024*1024;
elfaddr = (unsigned long) elfbase + phdr.p_offset;
dom_mpaddr = phdr.p_paddr;
-//printf("p_offset: %x, size=%x\n",elfaddr,filesz);
-#ifdef CONFIG_DOMAIN0_CONTIGUOUS
- if (d == dom0) {
- if (dom_mpaddr+memsz>dom0_size)
- panic("Dom0 doesn't fit in memory space!\n");
- dom_imva = __va_ul(dom_mpaddr + dom0_start);
- memcpy((void *)dom_imva, (void *)elfaddr, filesz);
- if (memsz > filesz)
- memset((void *)dom_imva+filesz, 0,
- memsz-filesz);
-//FIXME: This test for code seems to find a lot more than objdump -x does
- if (phdr.p_flags & PF_X) {
- privify_memory(dom_imva,filesz);
- flush_icache_range (dom_imva, dom_imva+filesz);
- }
- }
- else
-#endif
while (memsz > 0) {
p = assign_new_domain_page(d,dom_mpaddr);
BUG_ON (unlikely(p == NULL));
if (running_on_sim) {
dom0_size = 128*1024*1024; //FIXME: Should be configurable
}
-#ifdef CONFIG_DOMAIN0_CONTIGUOUS
- printf("alloc_dom0: starting (initializing %lu MB...)\n",dom0_size/(1024*1024));
-
- /* FIXME: The first trunk (say 256M) should always be assigned to
- * Dom0, since Dom0's physical == machine address for DMA purpose.
- * Some old version linux, like 2.4, assumes physical memory existing
- * in 2nd 64M space.
- */
- dom0_start = alloc_boot_pages(dom0_size >> PAGE_SHIFT, dom0_align >> PAGE_SHIFT);
- dom0_start <<= PAGE_SHIFT;
- if (!dom0_start) {
- panic("alloc_dom0: can't allocate contiguous memory size=%lu\n",
- dom0_size);
- }
- printf("alloc_dom0: dom0_start=0x%lx\n", dom0_start);
-#else
- // no need to allocate pages for now
- // pages are allocated by map_new_domain_page() via loaddomainelfimage()
- dom0_start = 0;
-#endif
+ /* no need to allocate pages for now
+ * pages are allocated by map_new_domain_page() via loaddomainelfimage()
+ */
}
char *cmdline)
{
int i, rc;
- unsigned long alloc_start, alloc_end;
start_info_t *si;
struct vcpu *v = d->vcpu[0];
unsigned long max_pages;
printk("*** LOADING DOMAIN 0 ***\n");
- alloc_start = dom0_start;
- alloc_end = dom0_start + dom0_size;
max_pages = dom0_size / PAGE_SIZE;
d->max_pages = max_pages;
d->tot_pages = 0;
if(initrd_start && initrd_len){
unsigned long offset;
- pinitrd_start= (dom0_start + dom0_size) -
- (PAGE_ALIGN(initrd_len) + 4*1024*1024);
+ pinitrd_start= dom0_size - (PAGE_ALIGN(initrd_len) + 4*1024*1024);
if (pinitrd_start <= pstart_info)
panic("%s:enough memory is not assigned to dom0", __func__);
bp->console_info.orig_y = bp->console_info.num_rows == 0 ?
0 : bp->console_info.num_rows - 1;
- bp->initrd_start = (dom0_start+dom0_size) -
- (PAGE_ALIGN(ia64_boot_param->initrd_size) + 4*1024*1024);
+ bp->initrd_start = dom0_size -
+ (PAGE_ALIGN(ia64_boot_param->initrd_size) + 4*1024*1024);
bp->initrd_size = ia64_boot_param->initrd_size;
vcpu_init_regs (v);
vcpu_regs(v)->r28 = bp_mpa;
-#ifdef CONFIG_DOMAIN0_CONTIGUOUS
- pkern_entry += dom0_start;
-#endif
vcpu_regs (v)->cr_iip = pkern_entry;
physdev_init_dom0(d);
unsigned long lookup_domain_mpa(struct domain *d, unsigned long mpaddr,
struct p2m_entry* entry)
{
- volatile pte_t *pte;
+ volatile pte_t *pte = lookup_noalloc_domain_pte(d, mpaddr);
-#ifdef CONFIG_DOMAIN0_CONTIGUOUS
- if (d == dom0) {
- pte_t pteval;
- if (mpaddr < dom0_start || mpaddr >= dom0_start + dom0_size) {
- //printk("lookup_domain_mpa: bad dom0 mpaddr 0x%lx!\n",mpaddr);
- //printk("lookup_domain_mpa: start=0x%lx,end=0x%lx!\n",dom0_start,dom0_start+dom0_size);
- }
- pteval = pfn_pte(mpaddr >> PAGE_SHIFT,
- __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX));
- return pte_val(pteval);
- }
-#endif
- pte = lookup_noalloc_domain_pte(d, mpaddr);
if (pte != NULL) {
pte_t tmp_pte = *pte;// pte is volatile. copy the value.
if (pte_present(tmp_pte)) {
static struct page_info *
__assign_new_domain_page(struct domain *d, unsigned long mpaddr, pte_t* pte)
{
- struct page_info *p = NULL;
+ struct page_info *p;
unsigned long maddr;
int ret;
BUG_ON(!pte_none(*pte));
-#ifdef CONFIG_DOMAIN0_CONTIGUOUS
- if (d == dom0) {
-#if 0
- if (mpaddr < dom0_start || mpaddr >= dom0_start + dom0_size) {
- /* FIXME: is it true ?
- dom0 memory is not contiguous! */
- panic("assign_new_domain_page: bad domain0 "
- "mpaddr=%lx, start=%lx, end=%lx!\n",
- mpaddr, dom0_start, dom0_start+dom0_size);
- }
-#endif
- p = mfn_to_page((mpaddr >> PAGE_SHIFT));
- return p;
- }
-#endif
-
p = alloc_domheap_page(d);
if (unlikely(!p)) {
printf("assign_new_domain_page: Can't alloc!!!! Aaaargh!\n");
struct page_info *
assign_new_domain_page(struct domain *d, unsigned long mpaddr)
{
-#ifdef CONFIG_DOMAIN0_CONTIGUOUS
- pte_t dummy_pte = __pte(0);
- return __assign_new_domain_page(d, mpaddr, &dummy_pte);
-#else
- struct page_info *p = NULL;
- pte_t *pte;
+ pte_t *pte = __lookup_alloc_domain_pte(d, mpaddr);
- pte = __lookup_alloc_domain_pte(d, mpaddr);
- if (pte_none(*pte))
- p = __assign_new_domain_page(d, mpaddr, pte);
+ if (!pte_none(*pte))
+ return NULL;
- return p;
-#endif
+ return __assign_new_domain_page(d, mpaddr, pte);
}
void
assign_new_domain0_page(struct domain *d, unsigned long mpaddr)
{
-#ifndef CONFIG_DOMAIN0_CONTIGUOUS
pte_t *pte;
BUG_ON(d != dom0);
panic("%s: can't allocate page for dom0", __func__);
}
}
-#endif
}
static unsigned long
else
flush_func = &flush_dcache_range;
-#ifdef CONFIG_DOMAIN0_CONTIGUOUS
- if (d == dom0) {
- /* This is not fully correct (because of hole), but it should
- be enough for now. */
- (*flush_func)(__va_ul (dom0_start),
- __va_ul (dom0_start + dom0_size));
- return;
- }
-#endif
for (i = 0; i < PTRS_PER_PGD; pgd++, i++) {
pud_t *pud;
if (!pgd_present(*pgd))